import java.io.*;
import java.util.*;

/**
 * @Author: wenjingyuan
 * @Date: 2023/03/24/15:20
 * @Description: KWIC算法实现
 */
public class KWIC2 {
    //存放经过平移后的每一行文本
    private ArrayList<String> kwicList=new ArrayList<String>();
    private ArrayList<String> lineTxt=new ArrayList<String>(); //存放读取的每一行原始文本
    private BufferedReader inputFile; //用于读取文件
    private BufferedWriter outputFile; //用于写入文件

    {
        KWIC2 kwic2=new KWIC2();
        kwic2.input("./test.txt"); //读取文件内容
        kwic2.shift(); //对读取的文本进行平移
        kwic2.alphabetizer(); //对平移后的文本进行排序
        kwic2.output("./test1.txt"); //将排序后的文本写入文件
    }

    //读取文件
    public  void input(String fileName) {
        try {
            inputFile = new BufferedReader(new FileReader(fileName));
        } catch (Exception e) {
            System.err.print("wrong"); //若文件读取出错，则输出错误信息
            System.exit(1); //退出程序
        }
        String line;
        try {
            while ((line = inputFile.readLine()) != null) {
                lineTxt.add(line); //将读取的每一行文本存入lineTxt中
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //将排序后的结果写入文件
    public void output(String fileName) {
        Iterator<String> it = kwicList.iterator();
        try {
            outputFile = new BufferedWriter(new FileWriter(fileName)); //创建文件写入流
            while (it.hasNext()) {
                outputFile.write(it.next() + "\n"); //将每一行文本写入文件
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (outputFile != null) {
                    outputFile.close(); //关闭文件写入流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //对读取的每一行文本进行平移
    public  void shift(){

        //获取每个单词，存入tokens
        Iterator<String> it=lineTxt.iterator();
        while(it.hasNext()){
            StringTokenizer token=new StringTokenizer(it.next()); //将每行文本按空格分离为单词
            ArrayList<String>tokens=new ArrayList<String>(); //存放分离后的每个单词
            int i=0;

            //循环添加单词
            int count=token.countTokens();
            while(i<count){
                tokens.add(token.nextToken()); //将分离后的每个单词存入tokens中
                i++;
            }

            //切割各个单词，不断改变起始值和利用loop实现位移。
            for(i=0;i<count;i++){
                StringBuffer lineBuffer=new StringBuffer();
                int index=i;
                for(int f=0;f<count;f++){

                    //从头继续位移
                    if(index>=count)
                        index=0;

                    //存入StringBuffer
                    lineBuffer.append(tokens.get(index));
                    lineBuffer.append(" ");
                    index++;
                }
                String tmp=lineBuffer.toString();
                kwicList.add(tmp); //将平移后的每一行文本存入kwicList中
            }
        }
    }

    //对平移后的文本进行排序
    public  void alphabetizer(){
        Collections.sort(this.kwicList,new AlphabetizerComparator()); //使用Collections.sort()方法进行排序，使用AlphabetizerComparator比较器实现按字母排序
    }

    //实现按字母排序的比较器
    private class AlphabetizerComparator implements Comparator<String> {
        @Override
        public int compare(String o1,String o2){
            if(o1==null&&o2==null){
                throw new NullPointerException(); //若参数为空，则抛出异常
            }
            int compareValue=0;
            char o1c=o1.charAt(0);
            char o2c=o2.charAt(0);
            compareValue=o1c-o2c; //对两个字符串的第一个字母进行比较
            return compareValue;
        }
    }
}
